﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using AccessProvider;
using ClassLib;
using System.Globalization;

namespace Interface
{
    public partial class DSHocSinh : Form
    {
        DataConnection dc = new DataConnection();

        public DSHocSinh()
        {
            InitializeComponent();
        }

        private void DSHocSinh_Load(object sender, EventArgs e)
        {

            LoadDSHS();
            loadLop();

        }

        private void loadLop()
        {
            //load danh sách lớp lên combobox
            string sql = "select * from LOP";  
            DataTable dt = dc.getData(sql);


            cbLop.DataSource = dt;
            cbLop.DisplayMember = "TenLop";
            cbLop.ValueMember = "TenLop";


            cbLopsearch.Items.Add(string.Empty);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    string tenLop = row["TenLop"].ToString();
                    
                    cbLopsearch.Items.Add(tenLop);
                }
            }

            
        }

        private void LoadDSHS()
        {
            

            string sql = "select * from HocSinh";
            DataTable dt = dc.getData(sql);

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow row = dt.Rows[i];
                string mahs = row["MaHS"].ToString();
                string hoten = row["HoTen"].ToString();
                Boolean gioitinh = Convert.ToBoolean(row["GioiTinh"]);
                string ngaysinh = row["NgaySinh"].ToString();
                string malop = row["MaLop"].ToString();
                string tenlop = MaloptoTenLop(malop);

                string email = row["Email"].ToString();
                string dienthoai = row["DienThoai"].ToString();
                string dchi = row["DiaChi"].ToString();

                HocSinh entity = new HocSinh(mahs, gioitinh, hoten, malop, ngaysinh, email, dienthoai, dchi);

                ListViewItem item = new ListViewItem(mahs.ToString());
                item.SubItems.Add(hoten);
                string gt = booltostring(gioitinh);

                item.SubItems.Add(gt);
                item.SubItems.Add(tenlop);

                item.Tag = entity;
                lvDSHS.Items.Add(item);
            }
        }

        private void lvDSHS_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvDSHS.SelectedItems.Count == 0) return;
            ListViewItem item = lvDSHS.SelectedItems[0];

            HocSinh entity = (HocSinh)item.Tag;
            txtHoTen.Text = entity.Hoten.ToString();
            txtMaSo.Text = entity.Mahs.ToString();
            

            txtNgaySinh.Text = entity.Ngaysinh.ToString();

            string gt = booltostring(entity.Gioitinh);

            if (gt == "nam")
            {
                rbNam.Checked = true;
            }
            else
            {
                rbNu.Checked = true;
            }

            txtEmail.Text = entity.Email;
            cbLop.Text = MaloptoTenLop( entity.Malop.ToString());
            txtDienThoai.Text = entity.Dt;
            txtDChi.Text = entity.Diachi;

        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            bool checktext = checkTextBox(txtHoTen, txtMaSo, txtNgaySinh);

            if (checktext == false)
            {
                MessageBox.Show("Bạn chưa nhập đầy đủ thông tin.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            string _mahs = txtMaSo.Text;

            AccessProvider.DataConnection dc = new AccessProvider.DataConnection();
            bool check = dc.checkMaHS(_mahs);

            if (check == false)
            {
                MessageBox.Show("Mã HS đã tồn tại.", "Lổi", MessageBoxButtons.OK);
                return;
            }

            //kiem tra tuoi.
            string date = txtNgaySinh.Text;
            string _ngaysinh = null;
            DateTime datevalue;
            if (DateTime.TryParse(date, out datevalue))
            {
                int namht = Convert.ToDateTime(txtNgaySinh.Text).Year;
                int curyear = DateTime.Now.Year;
                int tuoi = curyear - namht;
                if (tuoi > 15 && tuoi < 20)
                {
                    _ngaysinh = txtNgaySinh.Text;
                }
                else
                {
                    MessageBox.Show("Học sinh phải có tuổi hơn 15 và nhỏ hơn 20.", "Lổi", MessageBoxButtons.OK);
                    return;
                }

            }
            else 
            {
                MessageBox.Show("Ngày sinh không hợp lệ.", "Lổi", MessageBoxButtons.OK);
                return;
 
            }

            //lấy tên
            string _hoten = null;

            bool checkname = checkString(txtHoTen.Text);
            if (checkname == true)
            {
                _hoten = txtHoTen.Text;

            }
            else
            {
                MessageBox.Show("Họ tên không có số.", "Lổi", MessageBoxButtons.OK);
                return;
            }

            int _gt = 0;
            //groub box
            for (int i = 0; i < gbGioiTinh.Controls.Count; i++)
            {
                RadioButton rb = (RadioButton)gbGioiTinh.Controls[i];
                if (rbNam.Checked == true)
                {
                    _gt = stringtoint(rbNam.Text);
                }

            }



            string tenlop = cbLop.Text;
            string _lop = TenLoptoMaLop(tenlop);

            //kiem tra email.
            string _email = txtEmail.Text;

            Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
            Match match = regex.Match(_email);
            if (match.Success)
            {

            }
            else
            {
                MessageBox.Show("Email không đúng.", "Lổi", MessageBoxButtons.OK);
                return;
            }
            //lấy số dt(không cần nhập nếu null không lưu)
            string _dt = txtDienThoai.Text;
            //lay dia chi
            string _dchi = txtDChi.Text;


            string checkmax = "select soluongmax from Lop where MaLop = '" + _lop + "'";
            int max = dc.getNumberValue(checkmax);

            string checkcur = "select Count(MaHS) from HocSinh where MaLop = '" + _lop + "'";
            int cur = dc.getNumberValue(checkcur);

            if (cur < max)
            {
                string insertQuery = "insert into HOCSINH values ('" + _mahs + "' ,N'" + _hoten + "', '" + _gt + "', '" + _lop + "','" + _ngaysinh + "','" + _email + "','" + _dt + "',N'" + _dchi + "')";


                dc.ExecNonQuery(insertQuery);



                ClassLib.HocSinh hs = new ClassLib.HocSinh();
                hs.Mahs = _mahs;
                hs.Hoten = _hoten;
                hs.Gioitinh = inttobool(_gt);


                hs.Ngaysinh = _ngaysinh;
                hs.Malop = _lop;
                hs.Email = _email;
                hs.Dt = _dt;
                hs.Diachi = _dchi;


                ListViewItem item = new ListViewItem();
                item.Text = hs.Mahs;
                item.SubItems.Add(hs.Hoten);

                item.SubItems.Add(booltostring(hs.Gioitinh));
                hs.Gioitinh = inttobool(_gt);

                item.SubItems.Add(MaloptoTenLop(_lop));
                item.Tag = hs;

                lvDSHS.Items.Add(item);
            }
            else {
                MessageBox.Show("Lớp đã có đủ học sinh.", "Lổi", MessageBoxButtons.OK);
                return;
 
            }


        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (txtMaSo.Text.Length == 0)
            {
                MessageBox.Show("Chọn 1 học sinh để xóa.", "Lổi", MessageBoxButtons.OK);
                return;
            }

            string deleteQuery = "delete from HocSinh where MaHS ='" + txtMaSo.Text + "'";

            AccessProvider.DataConnection dc = new AccessProvider.DataConnection();
            dc.ExecNonQuery(deleteQuery);

            int position = lvDSHS.SelectedIndices[0];
            lvDSHS.Items.RemoveAt(position);

            cleartextbox(txtHoTen, txtMaSo, txtNgaySinh, txtEmail, txtDienThoai, txtDChi);

            if (lvDSHS.Items.Count == 0) return;

            if (position == lvDSHS.Items.Count)
            {
                int newposition = position - 1;
                lvDSHS.Items[newposition].Selected = true;

            }

            else lvDSHS.Items[position].Selected = true;

        }

        void cleartextbox(params TextBox[] txts)
        {
            foreach (TextBox txt in txts)
                txt.Clear();
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            ListViewItem item = lvDSHS.SelectedItems[0];
            ClassLib.HocSinh entity = (ClassLib.HocSinh)item.Tag;
            string curmahs = entity.Mahs.ToString();

            if (txtMaSo.Text.Length == 0)
            {
                MessageBox.Show("Chọn 1 học sinh để sửa.", "Lổi", MessageBoxButtons.OK);
                return;
            }

            string _maso = txtMaSo.Text;

            int _gt = 0;
            //groub box
            for (int i = 0; i < gbGioiTinh.Controls.Count; i++)
            {
                RadioButton rb = (RadioButton)gbGioiTinh.Controls[i];
                if (rbNam.Checked == true)
                {
                    _gt = stringtoint(rbNam.Text);
                }

            }


            string _hoten = null;
            
            bool checkname = checkString(txtHoTen.Text);
            if (checkname == true)
            {
                _hoten = txtHoTen.Text;

            }
            else
            {
                MessageBox.Show("Họ tên không có số.", "Lổi", MessageBoxButtons.OK);
                return;
            }
            string _malop = cbLop.Text;
            // kiem tra ngay sinh
            string date = txtNgaySinh.Text;
            string _ngaysinh = null;
            DateTime datevalue;
            if (DateTime.TryParse(date, out datevalue))
            {
                int namht = Convert.ToDateTime(txtNgaySinh.Text).Year;
                int curyear = DateTime.Now.Year;
                int tuoi = curyear - namht;
                if (tuoi > 15 && tuoi < 20)
                {
                    _ngaysinh = txtNgaySinh.Text;
                }
                else
                {
                    MessageBox.Show("Học sinh phải có tuổi hơn 15 và nhỏ hơn 20.", "Lổi", MessageBoxButtons.OK);
                    return;
                }

            }
            else
            {
                MessageBox.Show("Ngày sinh không hợp lệ.", "Lổi", MessageBoxButtons.OK);
                return;

            }

            string _email = txtEmail.Text;
            string _dt = txtDienThoai.Text;
            string _dchi = txtDChi.Text;

            if (curmahs == _maso)
            {

                string updateQuery = "update HOCSINH set HoTen = N'" + _hoten + "',GioiTinh = '" + _gt + "', MaLop = '" + _malop + "', NgaySinh = '" + _ngaysinh + "',Email = '" + _email + "', DienThoai = '" + _dt + "', DiaChi = N'" + _dchi + "' where MaHS = '" + txtMaSo.Text + "'";

                AccessProvider.DataConnection dc = new AccessProvider.DataConnection();
                dc.ExecNonQuery(updateQuery);


                lvDSHS.SelectedItems[0].SubItems[0].Text = _maso;
                lvDSHS.SelectedItems[0].SubItems[1].Text = _hoten;

                lvDSHS.SelectedItems[0].SubItems[2].Text = inttostring(_gt);
                lvDSHS.SelectedItems[0].SubItems[3].Text = _malop;
                // cap nhat tag

                entity.Hoten = _hoten;
                entity.Malop = _malop;
                entity.Mahs = _maso;
                entity.Ngaysinh = _ngaysinh;
                entity.Email = _email;
                entity.Dt = _dt;
                entity.Gioitinh = inttobool(_gt);
                entity.Diachi = _dchi;

            }
            else
            {
                MessageBox.Show("Ban không được sửa mã hs.", "Lổi", MessageBoxButtons.OK);
                return;
            }
        }



        bool checkTextBox(params TextBox[] txts)
        {
            bool isFilled = true;
            foreach (TextBox txt in txts)
            {
                if (txt.Text.Length == 0)
                {
                    isFilled = false;
                }
            }
            return isFilled;
        }

        public Boolean inttobool(int check)
        {
            Boolean gt = true;
            if (check == 0)
            {
                gt = false;
            }
            return gt;
        }

        public string inttostring(int check)
        {
            string gt = "nam";
            if (check == 0)
            {
                gt = "nữ";
            }
            return gt;
        }

        public int stringtoint(string check)
        {
            int gt = 1;
            if (check == "nữ")
            {
                gt = 0;
            }
            return gt;
        }

        public string booltostring(bool check)
        {
            string gt = "nữ";
            if (check == true)
            {
                gt = "nam";
            }
            return gt;
        }

        private void btLop_Click(object sender, EventArgs e)
        {
            Lop.CacLopHoc clh = new Lop.CacLopHoc();
            clh.Activate();
            clh.Show();
        }

        private void btSearch_Click(object sender, EventArgs e)
        {
            deletelistview();
            if (txtMsSearch.Text.Length == 0 && txtTenSearch.Text.Length == 0 )
            {
                
                string malop = TenLoptoMaLop(cbLopsearch.Text);
                string sql = "Select * from HocSinh where Malop = '" + malop + "'";
                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }
            else if(txtTenSearch.Text.Length >0 && txtMsSearch.Text.Length ==0 && cbLopsearch.Text.Length == 0)
            {
                string malop = TenLoptoMaLop(cbLopsearch.Text);
                string sql = "Select * from HocSinh where Hoten like N'%" + txtTenSearch.Text + "%' ";
                
                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }
            else if (txtTenSearch.Text.Length == 0 && txtMsSearch.Text.Length > 0 && cbLopsearch.Text.Length == 0)
            {
                
                string sql = "Select * from HocSinh where  MaHS like '%" + txtMsSearch.Text + "%'";

                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }

            else if (txtTenSearch.Text.Length > 0 && txtMsSearch.Text.Length > 0 && cbLopsearch.Text.Length ==0)
            {
                string malop = TenLoptoMaLop(cbLopsearch.Text);
                string sql = "Select * from HocSinh where MaHS like N'%" + txtMsSearch.Text + "%'and Hoten like N'%" + txtTenSearch.Text + "%' ";

                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }
            else if (txtTenSearch.Text.Length > 0 && txtMsSearch.Text.Length == 0 && cbLopsearch.Text.Length >0)
            {
                string malop = TenLoptoMaLop(cbLopsearch.Text);
                
                string sql = "Select * from HocSinh where Malop = '" + malop + "' and Hoten like N'%" + txtTenSearch.Text + "%' ";

                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }
            else if (txtTenSearch.Text.Length == 0 && txtMsSearch.Text.Length > 0 && cbLopsearch.Text.Length > 0)
            {
                string malop = TenLoptoMaLop(cbLopsearch.Text);

                string sql = "Select * from HocSinh where Malop = '" + malop + "' and MaHS like N'%" + txtMsSearch.Text + "%'";

                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }
            else if (txtTenSearch.Text.Length > 0 && txtMsSearch.Text.Length > 0 && cbLopsearch.Text.Length > 0)
            {
                string malop = TenLoptoMaLop(cbLopsearch.Text);

                string sql = "Select * from HocSinh where Malop = '" + malop + "' and MaHS like N'%" + txtMsSearch.Text + "%'and Hoten like N'%" + txtTenSearch.Text + "%'";

                DataTable dt = dc.getData(sql);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show("không có học sinh bạn cần tìm", "Lổi", MessageBoxButtons.OK);
                    return;

                }
                else
                {
                    updatethongtin(dt);
                }
            }
            
            

                
            


        }

        private void updatethongtin(DataTable dt)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow row = dt.Rows[i];
                string mahs = row["MaHS"].ToString();
                string hoten = row["HoTen"].ToString();
                Boolean gioitinh = Convert.ToBoolean(row["GioiTinh"]);
                string ngaysinh = row["NgaySinh"].ToString();
                string malop = row["MaLop"].ToString();

                string tenlop = MaloptoTenLop(malop);


                string email = row["Email"].ToString();
                string dienthoai = row["DienThoai"].ToString();
                string dchi = row["DiaChi"].ToString();

                HocSinh entity = new HocSinh(mahs, gioitinh, hoten, malop, ngaysinh, email, dienthoai, dchi);



                ListViewItem item = new ListViewItem(mahs.ToString());
                item.SubItems.Add(hoten);
                string gt = booltostring(gioitinh);

                item.SubItems.Add(gt);
                item.SubItems.Add(tenlop);

                item.Tag = entity;
                lvDSHS.Items.Add(item);
            }
        }

        

        private void deletelistview()
        {
            int data = lvDSHS.Items.Count;
            if (data > 0)
            {
                for (int i = 0; i < data; i++)
                {
                    ListViewItem item = lvDSHS.Items[0];
                    lvDSHS.Items.Remove(item);
                }
            }
        }

        private void btReset_Click(object sender, EventArgs e)
        {
            deletelistview();
            cleartextbox(txtDChi, txtDienThoai, txtEmail, txtHoTen, txtMaSo, txtMsSearch, txtNgaySinh, txtTenSearch);
            LoadDSHS();
            cbLopsearch.Items.Clear();
            loadLop();
            
            
        }


        private bool checkString(string a)
        {
            int len = a.Length;
            char[] letters = new char[len];
            letters = a.ToCharArray();
            for (int z = 0; z < len; z++)
            {
                if (letters[z] >= 48 && letters[z] <= 57)
                    return false;
            }
            return true;
        }

        private string MaloptoTenLop(string malop)
        {
            string tenLop = null;
            string sqlLop = "select * from Lop where MaLop = '" + malop + "' ";
            DataTable dt = dc.getData(sqlLop);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                     tenLop = row["TenLop"].ToString();
                    
                }
            }
            return tenLop;
        }

        private string TenLoptoMaLop(string tenlop)
        {
            string malop = null;
            string sqlLop = "select * from Lop where TenLop = '" + tenlop + "' ";
            DataTable dt = dc.getData(sqlLop);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    malop = row["MaLop"].ToString();

                }
            }
            return malop;
 
        }
        

        
        
    }
}
